// 封装 axios 请求模块
import axios from "axios";
import store from "@/store";

// 这个是用来处理js大数字的   2的53次方  js大数字会失真  0.1+0.2 !== 0.3
import JSONBig from "json-bigint";
import router from "../router";

const request = axios.create({
  baseURL: "http://ttapi.research.itcast.cn/", // 基础路径
  // data: 后端返回的原始数据，说白了就是 JSON 格式的字符串
  transformResponse: [
    function(data) {
      try {
        return JSONBig.parse(data);
      } catch (err) {
        return data;
      }

      // axios 默认会在内部这样来处理后端返回的数据
      // return JSON.parse(data)
    }
  ]
});

// 添加请求拦截器
request.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    // config: 本次请求的请求配置对象
    // console.log(config,11111)
    // 在vuex 里面获取 user信息
    const { user } = store.state;
    // 当用户登录和 有token时  每次请求携带上token
    if (user && user.token) {
      config.headers.Authorization = `Bearer ${user.token}`;
    }
    return config;
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    return response;
  },
  function(error) {
    // 如果请求出错了会进入这里
    // 首先由错误信息, 然后错误信息为 401  证明token过期 需要登录
    if (error.response && error.response.status == 401) {
      // 再判断 如果 没有 token 或者没有 refresh_token  就跳到登录页面
      if (!store.state.user || !store.state.user.refresh_token) {
        return router.push("/login");
      }
      // 如果有token 或者  refresh_token 上面return 不会走到这里
      // 只有当用有refresh_toekn的时候，才能发起请求
      try{
        axios({
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          method: 'PUT',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            Authorization: `Bearer ${store.state.user.refresh_token}`
          }
        }).then((res)=>{
          console.log('刷新成功',res);
          store.commit('setUser', {
            token: res.data.data.token,
            refresh_token: store.state.user.refresh_token
          })
          return request(error.config)
        })
      }catch(err) {
        router.push('/login')
      }
    }
    return Promise.reject(error);
  }
);

export default request;
